package com.lance.answer.question_answer;

import com.alibaba.fastjson.JSONObject;
import com.lance.answer.gui.answer.AnswerObject;
import com.lance.answer.gui.answer.Util;
import com.lance.answer.util.Constant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;


/**
 * 解决上传文件的问题
 */
@Slf4j
public class QuestionAnswerfalixue {

    /**
     * 进度表：
     * 6-18 19:55开始测试 公共行政学 行政管理专科
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //学科中文名
       // String subjectName = "公共行政学";
        String subjectName = "法理学";
        //专业中文名
     //   String majorName = "工商企业管理";
       // String majorName = "法律事务";
        String majorName = "金融管理";
        //并发开启的浏览器数量
        int sync = 8;
        //是否提交答案
        boolean commit = false;
        //驱动路径
        String driverPath = null;

        //初始化日志配置
        Constant.initLog();
        //开启任务
        start(subjectName, majorName, sync, driverPath, commit);
    }

    public static void start(String subjectName, String majorName, int sync, String driverPath, boolean commit) throws Exception {
        //获取模板路径,通过流的方式获取文件可以避免被打成jar包之后无法获取文件路径的异常
        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(subjectName + "/" + subjectName + "-answer.json");
        String answerStr = IOUtils.toString(inputStream);

        List<AnswerObject> list = JSONObject.parseArray(answerStr, AnswerObject.class);
        Map<String, AnswerObject> map = new HashMap<>();
        for (AnswerObject answerObject : list) {
            map.put(answerObject.getQuestionCode(), answerObject);
        }

        InputStream inputStream2 = Thread.currentThread().getContextClassLoader().getResourceAsStream(subjectName + "/" + "users/" + majorName + ".user");
        List<String> users = IOUtils.readLines(inputStream2, "utf-8");

        InputStream inputStream3 = Thread.currentThread().getContextClassLoader().getResourceAsStream(subjectName + "/" + subjectName + "-quiz.section");
        List<String> list1 = IOUtils.readLines(inputStream3);
        List<String> paths = new ArrayList<>();

        // ---行政管理(专科) --公共行政学  形考任务2：案例分析-----
        // paths.add("http://xinjiang.ouchn.cn/mod/assign/view.php?id=130338");
        // ---行政管理(专科) --公共行政学  形考任务2：案例分析-----


        // ---行政管理(专科) --政治学原理  形考任务2：案例分析-----
      //  paths.add("http://xinjiang.ouchn.cn/mod/assign/view.php?id=136215");
        // ---行政管理(专科) --政治学原理  形考任务2：案例分析-----

        // ---行政管理(专科) --政治学原理  形考任务3：读书笔记-----
   //     paths.add("http://xinjiang.ouchn.cn/mod/assign/view.php?id=136216");
        // ---行政管理(专科) --政治学原理  形考任务3：读书笔记-----

        // ---工商企业管理(专科) --西方经济学  形考任务3：读书笔记-----
        paths.add("http://xinjiang.ouchn.cn/mod/assign/view.php?id=29013");
        paths.add("http://xinjiang.ouchn.cn/mod/assign/view.php?id=29014");
        paths.add("http://xinjiang.ouchn.cn/mod/assign/view.php?id=29015");
        paths.add("http://xinjiang.ouchn.cn/mod/assign/view.php?id=29016");
        // http://xinjiang.ouchn.cn/mod/assign/view.php?id=29014
        // http://xinjiang.ouchn.cn/mod/assign/view.php?id=29015
        // http://xinjiang.ouchn.cn/mod/assign/view.php?id=29016
        // ---工商企业管理(专科) --西方经济学  形考任务3：读书笔记-----


        // FENGX
//        for (String str : list1) {
//            paths.add(str.split(",")[0].trim());
//        }
        // FENGX

        List<List<String>> group = new ArrayList<>();
        int size = users.size();
        int step = size / sync;
        if (step == 0) {
            group.add(users);
        } else {
            for (int i = 0; i < sync; i++) {
                List<String> list2 = users.subList(step * i, (i + 1) * step);
                group.add(list2);
            }
            group.add(users.subList(step * sync, users.size()));
        }
        for (List<String> batchUser : group) {
            Constant.THREAD_POOL_BATCH.execute(() -> {
                try {
                    for (String user : batchUser) {
                        String[] strs = user.split(",");
                        String userCode = strs[0];
                        String pwd = strs[1].substring(6, 14);
                        run(paths, map, subjectName, driverPath, userCode, pwd, commit);
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });

        }


    }


    // 管理学基础 2065001457555 19940419
    public static void run(List<String> urlTasks, Map<String, AnswerObject> answers, String subjectName, String driverPath, String userName, String password, boolean commit) throws Exception {
        WebDriver driver = Util.getDriver(driverPath);
        //String url = "http://student.ouchn.cn/";
        String url = "http://passport.ouchn.cn/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Dstudentspace%26redirect_uri%3Dhttp%253A%252F%252Fstudent.ouchn.cn%252F%2523%252Fsignin-oidc%2523%26response_type%3Did_token%2520token%26scope%3Dopenid%2520profile%2520ouchnuser%2520ouchnstudentspaceapi%2520offline_access%26state%3Dca1cb5d0270b49fdaea508b8a846c457%26nonce%3Dd257df51b0a141ac8ed35b1caf59ef4c";
        driver.get(url);
        Thread.sleep(3000);
        //Util.login(driver, "2065001457555", "19940419");
        Util.login(driver, userName, password);
        Util.switchToFirst(driver);
        Thread.sleep(3000);

        for (WebElement we : driver.findElements(By.className("media-body"))) {
            Util.switchToFirst(driver);
            // 找到管理学基础
            String mediaTitle = we.findElement(By.className("media-title")).getText();

            if (!mediaTitle.contains(subjectName)) {
                continue;
            }
            //点击进入学习的按钮
            WebElement studyButton = we.findElement(By.cssSelector("button[class='btn bg-primary']"));
            studyButton.click();
            //Util.switchToLast(driver);
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println(urlTasks.toString());
        int i = 1;
        for (String urlTask : urlTasks) {
            // FIXME 当完成第一份形考任务时，必须提交，否则会弹出 ”是否保存当前页面“消息
            driver.get(urlTask);
            Thread.sleep(2 * 1000);
            // 点击继续作业

            try {
                boolean isGoOn = true;
                for(WebElement we:driver.findElements(By.tagName("td"))){
                    if(we.getText().equals("已提交请评分")){
                        Thread.sleep(2000);
//                        driver.close();
//                        driver.quit();
                  //      return;
                        isGoOn = false;
                    }
                }
                if(!isGoOn){
                    i++;
                   continue;
                }




                //
            ///    driver.findElement(By.cssSelector("button[class='btn btn-secondary']")).click();
                driver.findElement(By.cssSelector("*[class='btn btn-secondary']")).click();
                Thread.sleep(5000);
                //  driver.findElement(By.cssSelector("div[class='fm-empty-container']")).sendKeys("F:\\答案.docx");
                driver.findElement(By.cssSelector("i[class='icon fa fa-list fa-fw ']")).click();
                driver.findElement(By.cssSelector("div[class='dndupload-arrow']")).click();

                // 选中 选中文件
                for (WebElement we : driver.findElements(By.className("fp-repo-name"))) {
                    if (we.getText().trim().equals("上传一个文件")) {
                        we.click();
                    }
                }
                //    driver.findElement(By.cssSelector("input[name='repo_upload_file']")).sendKeys("F:\\1.docx");


                Thread.sleep(2000);
                WebElement upload = driver.findElement(By.cssSelector("input[name='repo_upload_file']"));
                System.err.println("name:" + upload.getAttribute("name"));
                // ---行政管理(专科) --公共行政学  形考任务2：案例分析-----
              //  upload.sendKeys("F:\\1.docx");
                // ---行政管理(专科) --公共行政学  形考任务2：案例分析-----

                // ---行政管理(专科) --政治学原理  形考任务2：案例分析-----
              //  upload.sendKeys("F:\\案例1分析.docx");
                // ---行政管理(专科) --政治学原理  形考任务2：案例分析-----

                // ---行政管理(专科) --政治学原理  形考任务3：读书笔记-----
             //   upload.sendKeys("F:\\读书笔记.docx");
                // ---行政管理(专科) --政治学原理  形考任务3：读书笔记-----

                // ---工商企业管理(专科) --西方经济学  形考任务3：读书笔记-----
            //    upload.sendKeys("F:\\任务1.docx");
                upload.sendKeys("F:\\任务"+i+".docx");
                i++;
                // ---工商企业管理(专科) --西方经济学  形考任务3：读书笔记-----

                Thread.sleep(2000);
                // 点击上传
                driver.findElement(By.cssSelector("button[class='fp-upload-btn btn-primary btn']")).click();
                Thread.sleep(2000);
                // 保存更改
                driver.findElement(By.cssSelector("input[type='submit']")).click();
                Thread.sleep(5 * 1000);

                for(WebElement we:driver.findElements(By.cssSelector("*[class='btn btn-secondary']"))){
                    System.err.println("???"+we.getText());
                    if(we.getText().trim().equals("提交作业")){
                        System.err.println("==============提交作业");
                        we.click();
                        Thread.sleep(2000);
                        //            driver.findElement(By.cssSelector("input[name='submissionstatement']")).click();
                        //          Thread.sleep(2000);
                        driver.findElement(By.id("id_submitbutton")).click();
                        Thread.sleep(5000);
//                        driver.close();
//                        driver.quit();
                //        return;
                    }
                }


            } catch (Exception e) {
                System.err.println("taskUrl:" + urlTask + "  occur error");
                e.printStackTrace();
                Thread.sleep(100000);
             //   driver.close();
             //   driver.quit();
                // Thread.sleep(20000000);
            } finally {
                try {
                    Thread.sleep(2000);

                } catch (Exception e) {

                }
            }
            //回到试题首页
            TimeUnit.SECONDS.sleep(2);
        }
        TimeUnit.SECONDS.sleep(2);
        driver.close();
        driver.quit();
    }



}
